#include <atspi/atspi.h>
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>
#include <unistd.h>
#include <glib-unix.h> // 添加信号处理支持

// 添加全局退出标志
static volatile sig_atomic_t exiting = 0;

// 事件处理函数
static void focus_event_callback(AtspiEvent *event, void *user_data)
{
    if (exiting)
        return; // 安全屏障：退出时不处理新事件

    (void)user_data; // 避免未使用参数警告

    if (event && event->source)
    {
        GError *error = NULL;

        // 获取组件名称
        const char *name = atspi_accessible_get_name(event->source, &error);
        if (error)
        {
            fprintf(stderr, "Error getting name: %s\n", error->message);
            g_error_free(error);
        }
        else
        {
            // 获取组件角色
            error = NULL;
            AtspiRole role = atspi_accessible_get_role(event->source, &error);
            const char *role_name = "Unknown";
            if (!error)
            {
                role_name = atspi_role_get_name(role);
            }
            else
            {
                g_error_free(error);
            }

            printf("Focus Event: %s (%s)\n", name ? name : "NONAME", role_name);
        }
    }
}


// 信号处理函数
static gboolean handle_signal(gpointer user_data)
{
    exiting = 1; // 设置退出标志
    GMainLoop *loop = (GMainLoop *)user_data;
    g_main_loop_quit(loop);
    return FALSE; // 信号源只触发一次
}

int main()
{
    // 初始化 AT-SPI
    if (atspi_init() != 0)
    {
        fprintf(stderr, "AT-SPI initialization failed\n");
        return 1;
    }

    printf("AT-SPI initialized successfully\n");

    // 创建事件监听器
    GError *error = NULL;
    AtspiEventListener *listener = atspi_event_listener_new(
        (AtspiEventListenerCB)focus_event_callback, // 正确的函数指针类型
        NULL,                                       // 用户数据
        NULL                                        // 错误回调
    );

    if (!listener)
    {
        fprintf(stderr, "Failed to create event listener\n");
        atspi_exit();
        return 1;
    }

    // 注册焦点事件监听
    gboolean registered = atspi_event_listener_register(
        listener,
        "object:state-changed:focused",
        &error);

    if (error)
    {
        fprintf(stderr, "Error registering listener: %s\n", error->message);
        g_error_free(error);
        g_object_unref(listener);
        atspi_exit();
        return 1;
    }

    if (!registered)
    {
        fprintf(stderr, "Failed to register listener\n");
        g_object_unref(listener);
        atspi_exit();
        return 1;
    }

    // 创建主事件循环
    GMainLoop *loop = g_main_loop_new(NULL, FALSE);

    // 添加信号处理 (Ctrl+C)  //使用singal也是可以的，只不过存在一些安全问题
    g_unix_signal_add(SIGINT, handle_signal, loop);

    printf("Listening for focus changes. Press Ctrl+C to exit...\n");

    // 运行事件循环
    g_main_loop_run(loop);

    // 注销事件监听
    error = NULL;
    gboolean deregistered = atspi_event_listener_deregister(
        listener,
        "object:state-changed:focused",
        &error);

    if (error)
    {
        fprintf(stderr, "Error deregistering listener: %s\n", error->message);
        g_error_free(error);
    }

    if (!deregistered)
    {
        fprintf(stderr, "Failed to deregister listener\n");
    }

    sleep(1);

    // 释放监听器
    g_object_unref(listener);

    // 释放事件循环
    g_main_loop_unref(loop);

    atspi_exit();
    printf("\nProgram finished\n");
    return 0;
}